home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / cmouse.exe / CMOUSE.HPP < prev    next >
C/C++ Source or Header  |  1991-07-27  |  8KB  |  300 lines

  1. /*
  2.  
  3.     cmouse.hpp
  4.     7-27-91
  5.     Microsoft mouse interrupt functions
  6.  
  7.     Copyright 1991
  8.     John W. Small
  9.     All rights reserved
  10.  
  11.     PSW / Power SoftWare
  12.     P.O. Box 10072
  13.     McLean, Virginia 22102 8072
  14.     (703) 759-3838
  15.  
  16.  
  17.     Works consulted:
  18.  
  19.     "Microsoft Mouse Programmer's Reference."
  20.         Bellevue, Washington: Microsoft Press, 1989.
  21.  
  22.     "Microsoft Mouse Programmer's Reference Guide."
  23.         Bellevue, Washington: Microsoft Press, 1986.
  24.  
  25.     Refer to above works for mouse function
  26.     documentation.
  27.  
  28. */
  29.  
  30. #ifndef CMOUSE_HPP
  31. #define CMOUSE_HPP
  32.  
  33. #include <dos.h>
  34.  
  35. typedef  void interrupt (*MouseDriver)(...);
  36. typedef  void interrupt (*MouseHandler)(...);
  37.  
  38. #define MOUSE_INT 0x33
  39.  
  40. // mouse button designators
  41. #define MBleft   1
  42. #define MBright  2
  43.  
  44. // mouse events for callMask, altCallMask,
  45. // eventMask, eventFlags
  46. #define MEmoved          1
  47. #define MEleftPressed     2
  48. #define MEleftReleased    4
  49. #define MErightPressed    8
  50. #define MErightReleased  16
  51. #define MEshiftPressed   32
  52. #define MEctrlPressed    64
  53. #define MEaltPressed    128
  54.  
  55. // mouse types
  56. #define MTunknown  0
  57. #define MTbus      1
  58. #define MTserial   2
  59. #define MTinPort   3
  60. #define MTps2      4
  61. #define MThp       5
  62.  
  63. // mouse error message languages
  64. #define MLenglish      0
  65. #define MLfrench       1
  66. #define MLdutch        2
  67. #define MLgerman       3
  68. #define MLswedish      4
  69. #define MLfinnish      5
  70. #define MLspanish      6
  71. #define MLportuguese   7
  72. #define MLitalian      8
  73.  
  74.  
  75. // Do not instantiate the MicrosoftMouse class!
  76. // Reference MM.??? instead!
  77. // Call MM.open() to initialize the mouse for your program.
  78. // Call MM.close() when your program is finished with the mouse.
  79. // Write appropriate fields in MM and call member function
  80. // or call function and read appropriate fields.
  81. // Use physical screen coordinates for all values not
  82. // the mouse virtual coordinates.  Conversion to/from
  83. // mouse virtual coordinate is automatically handled
  84. // by the class member functions.
  85.  
  86. class MicrosoftMouse  {
  87.  
  88.     static unsigned Xcell[];
  89.     static unsigned Ycell[];
  90.     static unsigned LeftTopOfs[];
  91.  
  92.     // MF0, MF33 : Video mode at reset/softReset
  93.     // Call reset after all video mode changes!
  94.     unsigned vmode;
  95.  
  96.     // MF21, MF22, MF23 : Used by save and restore
  97.     void * origState, * state;
  98.     unsigned stateSize;
  99.  
  100.     // MF31, MF32 : Used by off/on
  101.     MouseDriver mouseIntrVector;
  102.  
  103.     // condOff virtual coordinates
  104.     unsigned covx1, covy1, covx2, covy2;
  105.  
  106. public:
  107.     // MF0 : Set by reset
  108.     unsigned present;
  109.     unsigned buttons;
  110.  
  111.     // MF3, MF5, MF6 : Button Status
  112.     unsigned leftPressed, rightPressed;
  113.  
  114.     // MF3, MF4 : Mouse Positon
  115.     unsigned x, y;
  116.     // X & Y are physical, not virtual coordinates!
  117.     // Text modes upper left corner : 1,1
  118.     // Graphics modes upper left corner : 0,0
  119.  
  120.     // MF5 : Button Press Information
  121.     unsigned lastLeftPressX, lastLeftPressY,
  122.         leftPresses;
  123.     unsigned lastRightPressX, lastRightPressY,
  124.         rightPresses;
  125.     // X & Y are physical, not virtual coordinates!
  126.  
  127.     // MF5, MF6 : Button Requested
  128.     unsigned buttonRequested;
  129.  
  130.     // MF6 : Button Release Information
  131.     unsigned lastLeftReleaseX, lastLeftReleaseY,
  132.         leftReleases;
  133.     unsigned lastRightReleaseX, lastRightReleaseY,
  134.         rightReleases;
  135.     // X & Y are physical, not virtual coordinates!
  136.  
  137.     // MF11 : Mouse motion counters
  138.     unsigned vertMickeys, horzMickeys;
  139.  
  140.     // MF12, MF20 : set/swapInterrupt(s) mask/addr
  141.     MouseHandler handler; // See MMautoEventHandler
  142.     unsigned callMask;
  143.     // Also used by autoEventUpdate.
  144.  
  145.     // Set by Mouse Event Handler.
  146.     unsigned eventMask, eventFlags, eventCount,
  147.         eventMoved;
  148.     long eventTime;
  149.     long clickTimeOut;
  150.     long leftClickTime;
  151.     unsigned leftClicks;
  152.     long rightClickTime;
  153.     unsigned rightClicks;
  154.  
  155.     // MF24, MF25 : set/getAltInterrupt mask/addr
  156.     MouseHandler altHandler; // See MMautoEventHandler
  157.     unsigned altCallMask;
  158.     // MF25 can read those set by MF20!
  159.  
  160.     // MF26, MF27 : set/getSensitivity
  161.     unsigned horzPercent, vertPercent, doublePercent;
  162.  
  163.     // MF29, MF30 : set/getCRTpage
  164.     unsigned crtPage;
  165.  
  166.     // MF34, MF35 : Used by get/setLanguage
  167.     unsigned language;
  168.  
  169.     // MF36 : Set by driver
  170.     unsigned driverVersion;
  171.     unsigned IRQ;
  172.     unsigned typeRequired;
  173.  
  174.  
  175.     void open();
  176.     void close();
  177.     void reset();                        /* MF0 */
  178.     void show()  { _AX = 1; geninterrupt(MOUSE_INT); }    /* MF1 */
  179.     void hide()  { _AX = 2; geninterrupt(MOUSE_INT); }      /* MF2 */
  180.     void updateStatusInfo();                /* MF3 */
  181.     void gotoxy();                        /* MF4 */
  182.     void updatePressInfo();                    /* MF5 */
  183.     void updateReleaseInfo();                /* MF6 */
  184.     void trap(unsigned x1, unsigned y1,                /* MF7, MF8 */
  185.         unsigned x2, unsigned y2);
  186.     void graphicsCursor(signed char horzHS,            /* MF9 */
  187.         signed char vertHS,
  188.         unsigned far *scrCurMask);
  189.     void softwareTextCursor(                /* MF10 */
  190.         unsigned scrMask, unsigned curMask)
  191.         { _BX = 0; _CX = scrMask; _DX = curMask;
  192.         _AX = 10; geninterrupt(MOUSE_INT); }
  193.     void updateMotionInfo()                    /* MF11 */
  194.         { _AX = 11; geninterrupt(MOUSE_INT);
  195.         horzMickeys = _CX; vertMickeys = _DX; }
  196.     void setInterrupt()  {                    /* MF12 */
  197.         _ES = FP_SEG(handler);
  198.         _DX = FP_OFF(handler);
  199.         _CX = callMask;
  200.         _AX = 12;
  201.         geninterrupt(MOUSE_INT);
  202.     }
  203.     void lightPenOn()                                       /* MF13 */
  204.         { _AX = 13; geninterrupt(MOUSE_INT); }
  205.     void lightPenOff()                    /* MF14 */
  206.         { _AX = 14; geninterrupt(MOUSE_INT); }
  207.     void speed(unsigned horz, unsigned vert)                /* MF15 */
  208.         { _CX = horz; _DX = vert; _AX = 15;
  209.         geninterrupt(MOUSE_INT); }
  210.     void condOffZone(unsigned x1, unsigned y1,
  211.         unsigned x2, unsigned y2)
  212.     {
  213.         covx1 = virtualX(x1);
  214.         covy1 = virtualY(y1);
  215.         covx2 = virtualX(x2);
  216.         covy2 = virtualY(y2);
  217.     }
  218.     void condOff()                                          /* MF16 */
  219.     {
  220.         _DI = covy2;
  221.         _SI = covx2;
  222.         _DX = covy1;
  223.         _CX = covx1;
  224.         _AX = 16;
  225.         geninterrupt(MOUSE_INT);
  226.     }
  227.     void doubleSpeedThreshold(unsigned mickeys)             /* MF19 */
  228.         { _DX = mickeys; _AX = 19;
  229.         geninterrupt(MOUSE_INT); }
  230.     void swapInterrupts();                    /* MF20 */
  231.     void autoEventUpdate();                    /* N/A  */
  232.     void save();                      /* MF21, MF22 */
  233.     void restore();                        /* MF23 */
  234.     void setAltInterrupt()                    /* MF24 */
  235.     {
  236.         _ES = FP_SEG(altHandler);
  237.         _DX = FP_OFF(altHandler);
  238.         _CX = altCallMask;
  239.         _AX = 24;
  240.         geninterrupt(MOUSE_INT);
  241.     }
  242.     void getAltInterrupt()                    /* MF25 */
  243.     {
  244.         _CX = altCallMask;
  245.         _AX = 25;
  246.         geninterrupt(MOUSE_INT);
  247.         altHandler = (MouseHandler) MK_FP(_BX,_DX);
  248.     }
  249.     void clearAltInterrupts();                /* N/A  */
  250.     void setSensitivity()                    /* MF26 */
  251.         { _DX = doublePercent; _CX = vertPercent;
  252.         _BX = horzPercent; _AX = 26;
  253.         geninterrupt(MOUSE_INT); }
  254.     void getSensitivity()                    /* MF27 */
  255.         { _AX = 27; geninterrupt(MOUSE_INT);
  256.         horzPercent = _BX; vertPercent = _CX;
  257.         doublePercent = _DX; }
  258.     void setInterruptRate(unsigned rate)                    /* MF28 */
  259.     {
  260.         if (typeRequired != MTinPort) return;
  261.         _BX = rate;
  262.         _AX = 28;
  263.         geninterrupt(MOUSE_INT);
  264.     }
  265.     void setCRTpage()                    /* MF29 */
  266.         { _BX = crtPage; _AX = 29;
  267.         geninterrupt(MOUSE_INT); }
  268.     void getCRTpage()                    /* MF30 */
  269.         { _AX = 30; geninterrupt(MOUSE_INT);
  270.         crtPage = _BX; }
  271.     void off();                        /* MF31 */
  272.     void on();                        /* MF32 */
  273.     void softReset();                    /* MF33 */
  274.     void setLanguage()                    /* MF34 */
  275.         { _BX = language; _AX = 34;
  276.         geninterrupt(MOUSE_INT); }
  277.     void getLanguage()                    /* MF35 */
  278.         { _AX = 35; geninterrupt(MOUSE_INT);
  279.         language = _BX; }
  280.     void driver();                        /* MF36 */
  281.  
  282.     unsigned virtualX(unsigned x)  {
  283.         return ((x - LeftTopOfs[vmode])
  284.         * Xcell[vmode]); }
  285.     unsigned virtualY(unsigned y)  {
  286.         return ((y - LeftTopOfs[vmode])
  287.         * Ycell[vmode]); }
  288.     unsigned physicalX(unsigned x)  {
  289.         return (x / Xcell[vmode]
  290.         + LeftTopOfs[vmode]); }
  291.     unsigned physicalY(unsigned y)  {
  292.         return (y / Ycell[vmode]
  293.         + LeftTopOfs[vmode]); }
  294.  
  295. };  // MicrosoftMouse
  296.  
  297. extern MicrosoftMouse MM;
  298.  
  299. #endif
  300.